<?php

class twitter_app{
	function getRequestToken($callback=""){
		global $config;
		
		$url="https://api.twitter.com/oauth/request_token";
		$tiempo=time();
		$oauth_nonce1=base64_encode($config->defaults["secretword"].$tiempo.rand());
		
		preg_match_all("/[a-z0-9]/i", $oauth_nonce1,$oauth_nonce);
		
		$oauth_nonce=implode("", $oauth_nonce[0]);
		
		$datos=array(
			"oauth_callback"=>$callback,
			"oauth_consumer_key"=>$config->defaults["twitter"]->oauth_consumer_key,
			"oauth_nonce"=>$oauth_nonce,
			"oauth_signature_method"=>"HMAC-SHA1",
			"oauth_timestamp"=>$tiempo,
			"oauth_version"=>"1.0"
			
			);
		$respuesta=$this->request($url,$datos);
		if($respuesta["oauth_token"]&&$respuesta["oauth_token_secret"]){
			$_SESSION["tw_oauth_token"]=$respuesta["oauth_token"];
			$_SESSION["tw_oauth_token_secret"]=$respuesta["oauth_token_secret"];
			
			return "https://api.twitter.com/oauth/authenticate?oauth_token=".$respuesta["oauth_token"];
		}
		else{
			return false;
		}
	}
	
	function getAccessToken($oauth_token,$oauth_verifier){
		global $config;
		if($oauth_token!=$_SESSION["tw_oauth_token"]){
			return false;
		}
		$url="https://api.twitter.com/oauth/access_token";
		
		$tiempo=time();
		$oauth_nonce1=base64_encode($config->defaults["secretword"].$tiempo.rand());
		
		$datos=array(
			"oauth_consumer_key"=>$config->defaults["twitter"]->oauth_consumer_key,
			"oauth_nonce"=>$oauth_nonce,
			"oauth_signature_method"=>"HMAC-SHA1",
			"oauth_timestamp"=>$tiempo,
			"oauth_token"=>$oauth_token,
			"oauth_version"=>"1.0"
			
			);
			
		$respuesta=$this->request($url,$datos,$oauth_token);
		if($respuesta["user_id"]){
			return $respuesta;
		}
		else {
			return false;
		}
	}
	function firmar($datos,$url,$key,$token="",$method="POST"){
		uksort($datos, 'strcmp');
		$datos2=array(
			);
		foreach(array_keys($datos) as $k){
			$datos2[]=$this->_urlencode_rfc3986($k)."=".$this->_urlencode_rfc3986($datos[$k]);
		}
		$firma=implode("&",$datos2);
		
		$firma=array(
			strtoupper($method),
			$this->_urlencode_rfc3986($url),
			$this->_urlencode_rfc3986($firma)
			);
		$key=$this->_urlencode_rfc3986($key)."&".($token?$this->_urlencode_rfc3986($url):"");
		$firma=implode("&",$firma);
		$firma2=base64_encode(hash_hmac("sha1",$firma,$key,true));
		return($firma2);
	}
		function createOauthHeader($data){
			$header="OAuth ";
			$data2=array();
			foreach(array_keys($data) as $k){
				$data2[]=$this->_urlencode_rfc3986($k).'="'.$this->_urlencode_rfc3986($data[$k]).'"';
			}
			return $header.implode(", ",$data2);
		}
	  function request($url,$data,$token=""){
	  	global $config;
		
		//header("content-type:text/plain");
		
	  	$data["oauth_signature"]=$this->firmar($data,$url,$config->defaults["twitter"]->oauth_consumer_secret,$token);
	  	
	  	ksort($data);
		$authHeader=$this->createOauthHeader($data);
			
	    $ch = curl_init($url);
		
        $headers = array(
                    'Authorization: '.$authHeader.'',
                    'Content-Type: application/xml; charset=UTF-8',
                    'Accept: */*',
                    "Host: api.twitter.com",
                    'User-Agent: twitter-pay-php-1.0');
	    curl_setopt($ch, CURLOPT_HEADER, 0);
	    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1) ;
	    curl_setopt($ch, CURLOPT_USERAGENT, 'twitter-pay-php-1.0');
		curl_setopt($ch, CURLOPT_POST, 1);
	    curl_setopt($ch, CURLOPT_POSTFIELDS, NULL);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
	
	
	    $respuesta=curl_exec($ch);
		$respuesta=$this->parseRespuesta($respuesta);
		return $respuesta;
	  }
  function parseRespuesta($respuesta){
	  	$respuesta=urldecode($respuesta);
		$respuesta=explode("&",$respuesta);
		$re=array();
		foreach ($respuesta as $r) {
			$r=explode("=",$r,2);
			$re[$r[0]]=$r[1];
		}
		return $re;
	  }
	function _urlencode_rfc3986($input)
	    {
	        if (is_array($input)) {
	            return array_map(array('Twitauth', '_urlencode_rfc3986'), $input);
	        }
	        else if (is_scalar($input)) {
	            return str_replace('+',' ',str_replace('%7E', '~', rawurlencode($input)));
	        }
	        else{
	            return '';
	        }
	    }
}
